//package com.speedchina.permission.web;
//
//import com.auth0.jwt.JWT;
//import com.auth0.jwt.JWTVerifier;
//import com.auth0.jwt.algorithms.Algorithm;
//import com.auth0.jwt.exceptions.JWTDecodeException;
//import com.auth0.jwt.interfaces.DecodedJWT;
//import com.speedchina.permission.domain.sys.entity.User;
//import com.speedchina.permission.properties.JwtProperties;
//import com.speedchina.permission.properties.SafeProperties;
//import org.apache.shiro.crypto.hash.SimpleHash;
//import org.junit.Test;
//import org.junit.runner.RunWith;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.boot.context.properties.EnableConfigurationProperties;
//import org.springframework.boot.test.context.SpringBootTest;
//import org.springframework.test.context.TestPropertySource;
//import org.springframework.test.context.junit4.SpringRunner;
//import org.springframework.util.StringUtils;
//
//import javax.servlet.http.HttpServletRequest;
//import java.util.Date;
//import java.util.HashMap;
//import java.util.Map;
//
///**
// * jwt工具
// * jwt刷新机制： https://www.sundayfine.com/jwt-refresh-token/
// * - 考虑页面多个请求，被替换的 老token 还要预留有效时间
// *
// * -- 还一种：前端处理token刷新 【即将失效:,在用,】
// * @author Winter
// * @create 2020-11-12 下午4:47
// **/
////@Configuration
//@EnableConfigurationProperties({JwtProperties.class})
////@Component
//
//@RunWith(SpringRunner.class)
//@SpringBootTest
////@Rollback(value = true)
////@Transactional(transactionManager = "transactionManager")
//public class JwtUtil {
//
//    @Autowired
//    JwtProperties jwtConfig;
//    @Autowired
//    SafeProperties safeProperties;
//
//    /**
//     * 生成签名
//     * @param user
//     * @return
//     */
//    public String sign(User user) {
//        Date expiresAt = new Date((new Date()).getTime() + jwtConfig.getExpire() * 1000);
//        Map<String,Object> header=new HashMap<>(2);
//        header.put("typ","JWT");
//        header.put("alg","HS256");
//        return JWT.create()
//                .withHeader(header)
//                .withClaim("userId", user.getId())
//                .withClaim("username", user.getUsername())
//                .withExpiresAt(expiresAt)
//                .sign(Algorithm.HMAC256(StringUtils.isEmpty(jwtConfig.getSecret()) ? user.getPassword() : jwtConfig.getSecret()));
//    }
//
//    public boolean refreshToken(String jwtToken) {
//        // 刷新并延长 token 有效期
//        return true;
//    }
//
//    /**
//     * 校验token是否过期
//     * @return
//     */
//    public boolean isExpired(String jwtToken) {
//        DecodedJWT jwt = JWT.decode(jwtToken);
//        return jwt.getExpiresAt().before(new Date());
//    }
//
//    public boolean verify(String token, User user) {
//        try {
//            Algorithm algorithm = Algorithm.HMAC256(StringUtils.isEmpty(jwtConfig.getSecret()) ? user.getPassword() : jwtConfig.getSecret());
//            JWTVerifier verifier = JWT.require(algorithm)
//                    .withClaim("userId", user.getId())
//                    .withClaim("username", user.getUsername())
//                    .build();
//            DecodedJWT jwt = verifier.verify(token);
//            return jwt != null;
//        } catch (Exception exception) {
//            return false;
//        }
//    }
//
//    public String getJwtToken(HttpServletRequest request) {
//        String token = request.getHeader(jwtConfig.getHeaderName());
//        if(StringUtils.isEmpty(token)) {
//            token = request.getParameter(jwtConfig.getHeaderName());
//        }
//        return token;
//    }
//
//    public User getLoginUser(HttpServletRequest request) {
//        if (this.isAccessAllowed(request)) {
//            String token = this.getJwtToken(request);
//            return this.getLoginUser(token);
//        }
//        return null;
//    }
//
//    /**
//     * 获取登录用户， 密码置空
//     * @param token
//     * @return
//     */
//    public User getLoginUser(String token) {
//        DecodedJWT jwt = JWT.decode(token);
//        return new User(jwt.getClaim("userId").asString(), jwt.getClaim("username").asString());
//    }
//
//    /**
//     * 判断是否允许访问
//     * @param request
//     * @return
//     */
//    public boolean isAccessAllowed(HttpServletRequest request) {
//        String token = this.getJwtToken(request);
//        if(StringUtils.isEmpty(token)) {
//            throw new SecurityException("无合法token值");
//        }
//        try {
//            if(isExpired(token)) {
//                throw new SecurityException("token已过期");
//            }
//        } catch (JWTDecodeException e) {
//            throw new SecurityException("该token无效");
//        }
//        return true;
//    }
//    public String passwordEncoder(String credentials, String salt) {
//        Object object =
//                StringUtils.isEmpty(salt) ?
//                        new SimpleHash(safeProperties.getHashAlgorithmName(), credentials) :
//                        new SimpleHash(safeProperties.getHashAlgorithmName(), credentials, salt, safeProperties.getHashIterations());
//        return object.toString();
//    }
//    @Test
//    public void encodePassword(){
//        System.err.println(
//                passwordEncoder("admin","654321"));
//        String token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2MTg5MDEyMTMsInVzZXJJZCI6ImVmNDVmYTQxLWViNDctNDEwZi05NWZmLWFhYWFlMzE0NjNjNiIsInVzZXJuYW1lIjoid3hkIn0.SoXmfonepLazcITBdoe4PG-8iKENAPWJbVUlolxDNBM";
//        System.err.println(isExpired(token));
//        DecodedJWT jwt = JWT.decode(token);
//        System.err.println(jwt.getExpiresAt().toGMTString());
////        System.err.println(getLoginUser("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2MTg4MTA5NzAsInVzZXJJZCI6ImVmNDVmYTQxLWViNDctNDEwZi05NWZmLWFhYWFlMzE0NjNjNiIsInVzZXJuYW1lIjoid3hkIn0.PXg5eL3Qo2Cj--A3xC2Wr5XsGIyVuQ8xHvqbN_mC4vs"));
//    }
//}
